package ve.gob.cne.action.usuario;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import ve.gob.cne.action.common.SaceCommonAction;
import ve.gob.cne.to.CargoTo;
import ve.gob.cne.to.PerfilTo;
import ve.gob.cne.to.UsuarioTo;
import ve.gob.cne.util.SHA1;

public class UsuarioAction extends SaceCommonAction {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5955279313472030959L;
	private final static Logger logger = Logger.getLogger(UsuarioAction.class);
	private int cedula;
	private String clave;
	private String mensaje;
	private String nombres;
	private String apellidos;
	private String correo;
	private String cargo;
	private String telefono;
	private int idPerfil;
	private List<PerfilTo> perfiles;
	private List<UsuarioTo> listaUsuarios;
	private List<CargoTo> cargos;
	private UsuarioTo usuario;

	/**
	 * Metodo init(), metodo que inicializa la lista de usuarios
	 * 
	 * @return
	 */
	public String init() {
		clearErrorsAndMessages();
		try {

			this.getUsuarios();

		} catch (Exception e) {
			logger.error("Ha ocurrido un error con el siguiente mensaje: "
					+ e.getMessage());
		}
		return SUCCESS;
	}

	/**
	 * Metodo initPerfil, inicializa la lista de perfiles
	 */
	@SuppressWarnings("unchecked")
	public String initCombos() {
		try {

			perfiles = new ArrayList<PerfilTo>();
			perfiles.addAll(this.getServicioUsuario().getPerfiles());
			cargos = new ArrayList<CargoTo>();
			cargos.addAll(this.getServicioUsuario().getCargos());
			this.getSession().put("perfiles", perfiles);
			this.getSession().put("cargos", cargos);
		} catch (Exception e) {
			logger.error("Ha ocurrido un error con el siguiente mensaje: "
					+ e.getMessage());
		}
		return SUCCESS;
	}

	/**
	 * Metodo registrarUsuario, metodo que registra los usuaruios de la
	 * aplicacion.
	 * 
	 * @return
	 */
	public String registrarUsuario() {
		String result = ERROR;
		boolean registrar = true;

		try {

			SHA1 sha = new SHA1();
			UsuarioTo usuario = new UsuarioTo();
			usuario.setCedula(this.getCedula());
			usuario.setPassword(sha.getHash(this.getClave()));
			usuario.setNombres(this.getNombres().toUpperCase());
			usuario.setApellidos(this.getApellidos().toUpperCase());
			cargos = (List<CargoTo>) this.getSession().get("cargos");
			for (CargoTo c : cargos) {
				if (c.getId() == Integer.parseInt(this.getCargo())) {
					usuario.setCargo(c);
				}
			}

			usuario.setCorreo(this.getCorreo().toUpperCase());
			usuario.setHabilitado(1);
			usuario.setTelefono(this.getTelefono());
			perfiles = (List<PerfilTo>) this.getSession().get("perfiles");
			for (PerfilTo p : perfiles) {
				if (p.getId() == this.getIdPerfil()) {
					usuario.setPerfil(p);
				}
			}

			this.listaUsuarios = this.getServicioUsuario().getUsuarios();
			if (this.listaUsuarios != null && !this.listaUsuarios.isEmpty()) {
				for(UsuarioTo u : listaUsuarios){
					if(u.getCedula() == this.getCedula()){
						registrar = false;
						addActionError("Usuario ya esta registrado en la base de datos");
						break;
					}
					
				}		
				
			} 
			if(registrar){
				this.getServicioUsuario().registrarUsuario(usuario);
				result = SUCCESS;
			}

		} catch (Exception e) {
			logger.error("Ha ocurrido un error con el siguiente mensaje: "
					+ e.getMessage());
		}

		return result;
	}

	@SuppressWarnings("unchecked")
	public String getUsuarios() {

		try {
			List<UsuarioTo> temp = new ArrayList<UsuarioTo>();
			this.listaUsuarios = this.getServicioUsuario().getUsuarios();
			for (UsuarioTo user : listaUsuarios) {
				if (user.getHabilitado() != 0) {
					temp.add(user);
				}
			}
			listaUsuarios = new ArrayList<UsuarioTo>();
			listaUsuarios = temp;
			temp = null;
			this.getSession().put("listaUsuarios", listaUsuarios);
		} catch (Exception e) {
			logger.error("Ha ocurrido un error con el siguiente mensaje: "
					+ e.getMessage());
		}

		return SUCCESS;
	}

	@SuppressWarnings("unchecked")
	public String initEdit() {
		try {
			this.initCombos();
			usuario = this.getServicioUsuario().getUsuario(this.getCedula());
			this.getSession().put("usuarioEdit", usuario);

		} catch (Exception e) {
			logger.error("Ha ocurrido un error con el siguiente mensaje: "
					+ e.getMessage());
		}
		return SUCCESS;
	}

	public String modificarUsuario() {
		SHA1 sha = new SHA1();
		try {
			UsuarioTo usuario = (UsuarioTo) this.getSession()
					.get("usuarioEdit");
			usuario.setPassword(sha.getHash(this.getClave()));
			usuario.setCedula(this.getCedula());
			usuario.setNombres(this.getNombres());
			usuario.setApellidos(this.getApellidos());
			cargos = (List<CargoTo>) this.getSession().get("cargos");
			for (CargoTo c : cargos) {
				if (c.getId() == Integer.parseInt(this.getCargo())) {
					usuario.setCargo(c);
				}
			}
			usuario.setCorreo(this.getCorreo());
			usuario.setTelefono(this.getTelefono());
			perfiles = (List<PerfilTo>) this.getSession().get("perfiles");
			for (PerfilTo p : perfiles) {
				if (p.getId() == this.getIdPerfil()) {
					usuario.setPerfil(p);
				}
			}
			usuario.setHabilitado(1);
			this.getServicioUsuario().registrarUsuario(usuario);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			logger.error("Ha ocurrido un error con el siguiente mensaje: "
					+ e.getMessage());
		}

		return SUCCESS;
	}

	public String eliminarUsuario() {

		try {

			UsuarioTo usuario = (UsuarioTo) this.getSession()
					.get("usuarioEdit");
			usuario.setHabilitado(0);
			this.getServicioUsuario().registrarUsuario(usuario);

		} catch (Exception e) {
			logger.error("Ha ocurrido un error con el siguiente mensaje: "
					+ e.getMessage());
		}

		return SUCCESS;
	}

	public int getCedula() {
		return cedula;
	}

	public void setCedula(int cedula) {
		this.cedula = cedula;
	}

	public String getClave() {
		return clave;
	}

	public void setClave(String clave) {
		this.clave = clave;
	}

	public String getMensaje() {
		return mensaje;
	}

	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}

	public String getNombres() {
		return nombres;
	}

	public void setNombres(String nombres) {
		this.nombres = nombres;
	}

	public String getApellidos() {
		return apellidos;
	}

	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}

	public String getCorreo() {
		return correo;
	}

	public void setCorreo(String correo) {
		this.correo = correo;
	}

	public String getCargo() {
		return cargo;
	}

	public void setCargo(String cargo) {
		this.cargo = cargo;
	}

	public String getTelefono() {
		return telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public List<PerfilTo> getPerfiles() {
		return perfiles;
	}

	public void setPerfiles(List<PerfilTo> perfiles) {
		this.perfiles = perfiles;
	}

	public int getIdPerfil() {
		return idPerfil;
	}

	public void setIdPerfil(int idPerfil) {
		this.idPerfil = idPerfil;
	}

	/**
	 * @return the listaUsuarios
	 */
	public List<UsuarioTo> getListaUsuarios() {
		return listaUsuarios;
	}

	/**
	 * @param listaUsuarios
	 *            the listaUsuarios to set
	 */
	public void setListaUsuarios(List<UsuarioTo> listaUsuarios) {
		this.listaUsuarios = listaUsuarios;
	}

	/**
	 * @return the usuario
	 */
	public UsuarioTo getUsuario() {
		return usuario;
	}

	/**
	 * @param usuario
	 *            the usuario to set
	 */
	public void setUsuario(UsuarioTo usuario) {
		this.usuario = usuario;
	}

	public List<CargoTo> getCargos() {
		return cargos;
	}

	public void setCargos(List<CargoTo> cargos) {
		this.cargos = cargos;
	}
}